﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CoreLibrary.Entidade;
using System.Xml.Linq;
using System.Reflection;
using ParasitoLibrary.Core.Entidade.Attribute;

namespace ParasitoLibrary.Core.Entidade
{
    public abstract partial class EntidadeParasitoAbstrata
    {

        #region .:> Construtores

        public EntidadeParasitoAbstrata(XElement elemento)
        {
            Type tipoObjeto = this.GetType();

            PropertyInfo[] properytInfo = tipoObjeto.GetProperties();
            object[] atributos = null;

            foreach (PropertyInfo info in properytInfo)
            {
                atributos = info.GetCustomAttributes(typeof(PropriedadeSemTagXMLAttribute), false);

                if (atributos == null || atributos.Length == 0)
                {
                    if (info.PropertyType.Equals(typeof(string)))
                    {
                        info.SetValue(this, elemento.Descendants(info.Name.ToLower()).Single().Value, null);
                    }
                    else if (info.PropertyType.Equals(typeof(int)))
                    {
                        info.SetValue(this, Int32.Parse(elemento.Descendants(info.Name.ToLower()).Single().Value), null);
                    }
                }
            }

        }

        #endregion

        public virtual XElement toElementoXml()
        {
            Type tipoObj = this.GetType();

            XElement elementoRoot = new XElement(tipoObj.Name.ToLower());

            PropertyInfo[] properytInfo = tipoObj.GetProperties();

            XElement elemento = null;

            foreach (PropertyInfo info in properytInfo)
            {
                elemento = null;
    
                //if (!info.GetType().Equals(this.GetType()))
                //{
                    elemento = new XElement(info.Name.ToLower(), info.GetValue(this, null));
                //}
                //else
                //{
                    //EntidadeParasitoAbstrata entidadeParasitoAbstrata = (EntidadeParasitoAbstrata) info.GetValue(this, null);
                    //elemento = entidadeParasitoAbstrata.toElementoXml();
                //}
                
                if ( elemento != null ) 
                {
                    elementoRoot.Add(elemento);
                }
            }

            return elementoRoot;
        }
    }
}
